「敏感資料」、「設定檔」...每次更改設定檔都需要重新包成映像檔,覺得很麻煩嗎?那麼你該了解一下 Config
與 Secret
的用法了,學會這個用法可以省去許多麻煩,甚至可以僅更改外層資料便能夠影響容器內的世界,接下來就來看看什麼是 ConfigMap
與 Secret
吧!
在 Kubernetes
中,ConfigMap
可以是扮演著字典檔的角色,以「Key」、「Values」的方式存放著「非敏感」,以不需要加密的資訊,例如:
Debug
模式Log
等級## configmap.yml
apiVersion: v1 ## API 版本
kind: ConfigMap ## 元件種類
metadata:
name: special-config ## ConfigMap 名稱
namespace: default ## ConfigMap 所屬的 Namespace
data:
special.how: very ## ConfigMap 資料(Key=special.how; value=very)
---
apiVersion: v1
kind: ConfigMap
metadata:
name: env-config
namespace: default
data:
log_level: INFO
## pod.yml
apiVersion: v1 ## API 版本
kind: Pod ## 元件種類
metadata:
name: dapi-test-pod ## Pod 名稱
spec:
containers:
- name: test-container ## Container 名稱
image: k8s.gcr.io/busybox ## Image 名稱
command: [ "/bin/sh", "-c", "env" ] ## Pod 啟動後,必須執行的命令
env: ## 賦予環境變數
- name: SPECIAL_LEVEL_KEY ## 在容器內的變數名稱
valueFrom: ## 指定值從名稱為 special-config 的 ConfigMap 中取得 key 名稱為「special.how」取得
configMapKeyRef:
name: special-config
key: special.how
- name: LOG_LEVEL ## 在容器內的變數名稱
valueFrom:
configMapKeyRef: ## 指定值從名稱為 env-config 的 ConfigMap 中取得 key 名稱為「log_level」取得
name: env-config
key: log_level
restartPolicy: Never
當啟動服務後,可以看見Pod的輸出包括環境變量SPECIAL_LEVEL_KEY=very
和LOG_LEVEL=INFO
另外也可以扮演設定檔掛載的角色,例如:
env
檔案# 撰寫 nginx 設定檔
apiVersion: v1
kind: ConfigMap
metadata:
name: nginx-map
data:
test.conf: |
server {
listen 80;
server_name zxc.com;
location / {
root /home/nginx_html ;
index index.html index.htm;
}
}
test1.conf: |
server {
listen 80;
server_name abc.com;
location / {
root /home/nginx_html ;
index index1.html index1.htm;
}
}
---
## 佈署容器服務,此時服務尚未對外,僅供容器內彼此溝通
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx
spec:
replicas: 2
selector:
matchLabels:
service: http-server
template:
metadata:
labels:
service: http-server
spec:
containers:
- name: nginx
image: 10.28.16.107:8899/library/demo-nginx:0.1.0
imagePullPolicy: IfNotPresent
ports:
- containerPort: 80
volumeMounts:
- mountPath: /etc/nginx/conf.d # mount nginx-conf volumn to /etc/nginx/conf.d
readOnly: true
name: deployment-nginx-conf
volumes:
- name: deployment-nginx-conf
configMap:
name: nginx-map # place ConfigMap `nginx-conf` on /etc/nginx
---
## 新增對外服務
apiVersion: v1
kind: Service
metadata:
name: nginx-service
spec:
selector:
service: http-server
ports:
- port: 80
targetPort: 80
Secret
跟 ConfigMap
相同用法,只是對象類型適用於保護「敏感資料」,例如:
Secret
作為保存,在放置容器服務內提供程式做使用這些敏感資料都將由 Secret 保存著,在提供 Container 使用。
##secret.yml
apiVersion: v1 ## API 版本
kind: Secret ## 元件種類
metadata:
name: mysecret ## Secret 名稱
type: Opaque ## 是一個map結構(key-value),其中vlaue要求以base64格式編碼
data: ## 存放隱私資料,以「key:value」呈現
username: YWRtaW4=
password: MWYyZDFlMmU2N2Rm
## pod.yaml
apiVersion: v1
kind: Pod
metadata:
name: secret-env-pod
spec:
containers:
- name: mycontainer
image: redis
env:
- name: SECRET_USERNAME
valueFrom:
secretKeyRef:
name: mysecret
key: username
- name: SECRET_PASSWORD
valueFrom:
secretKeyRef:
name: mysecret
key: password
restartPolicy: Never
以上就是 ConfigMap
與 Secret
的說明與示範